package com.media.system.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.media.system.domain.MediaFile;
import com.media.system.service.dto.FileUploadRequest;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * 媒体文件服务接口
 * 
 * @author Claude
 * @since 2024-01-20
 */
public interface MediaFileService extends IService<MediaFile> {

    /**
     * 上传媒体文件
     * 
     * @param file 文件
     * @param request 上传请求
     * @return 媒体文件信息
     */
    MediaFile uploadFile(MultipartFile file, FileUploadRequest request);

    /**
     * 批量上传媒体文件
     * 
     * @param files 文件列表
     * @param request 上传请求
     * @return 媒体文件列表
     */
    List<MediaFile> batchUploadFiles(List<MultipartFile> files, FileUploadRequest request);

    /**
     * 根据用户ID分页查询媒体文件
     * 
     * @param page 分页对象
     * @param userId 用户ID
     * @param fileType 文件类型（可选）
     * @return 分页结果
     */
    Page<MediaFile> selectMediaFilesByUserId(Page<MediaFile> page, Long userId, String fileType);

    /**
     * 根据家庭ID查询公开的媒体文件
     * 
     * @param page 分页对象
     * @param familyId 家庭ID
     * @return 分页结果
     */
    Page<MediaFile> selectMediaFilesByFamilyId(Page<MediaFile> page, Long familyId);

    /**
     * 搜索媒体文件
     * 
     * @param page 分页对象
     * @param userId 用户ID
     * @param keyword 搜索关键字
     * @return 分页结果
     */
    Page<MediaFile> searchMediaFiles(Page<MediaFile> page, Long userId, String keyword);

    /**
     * 根据标签查询媒体文件
     * 
     * @param page 分页对象
     * @param userId 用户ID
     * @param tags 标签
     * @return 分页结果
     */
    Page<MediaFile> selectMediaFilesByTags(Page<MediaFile> page, Long userId, String tags);

    /**
     * 获取最近上传的文件
     * 
     * @param userId 用户ID
     * @param limit 数量限制
     * @return 媒体文件列表
     */
    List<MediaFile> getRecentMediaFiles(Long userId, Integer limit);

    /**
     * 获取收藏的文件
     * 
     * @param page 分页对象
     * @param userId 用户ID
     * @return 分页结果
     */
    Page<MediaFile> getFavoriteMediaFiles(Page<MediaFile> page, Long userId);

    /**
     * 切换文件收藏状态
     * 
     * @param fileId 文件ID
     * @param userId 用户ID
     * @return 操作结果
     */
    boolean toggleFavorite(Long fileId, Long userId);

    /**
     * 删除媒体文件
     * 
     * @param fileId 文件ID
     * @param userId 用户ID
     * @return 操作结果
     */
    boolean deleteMediaFile(Long fileId, Long userId);

    /**
     * 批量删除媒体文件
     * 
     * @param fileIds 文件ID列表
     * @param userId 用户ID
     * @return 操作结果
     */
    boolean batchDeleteMediaFiles(List<Long> fileIds, Long userId);

    /**
     * 移动文件到回收站
     * 
     * @param fileId 文件ID
     * @param userId 用户ID
     * @return 操作结果
     */
    boolean moveToTrash(Long fileId, Long userId);

    /**
     * 从回收站恢复文件
     * 
     * @param fileId 文件ID
     * @param userId 用户ID
     * @return 操作结果
     */
    boolean restoreFromTrash(Long fileId, Long userId);

    /**
     * 生成文件分享链接
     * 
     * @param fileId 文件ID
     * @param userId 用户ID
     * @param expireHours 过期小时数
     * @return 分享链接
     */
    String generateShareLink(Long fileId, Long userId, Integer expireHours);

    /**
     * 更新文件标签
     * 
     * @param fileId 文件ID
     * @param userId 用户ID
     * @param tags 标签
     * @return 操作结果
     */
    boolean updateFileTags(Long fileId, Long userId, String tags);

    /**
     * 更新文件AI标签
     * 
     * @param fileId 文件ID
     * @param aiTags AI标签
     * @return 操作结果
     */
    boolean updateAiTags(Long fileId, String aiTags);

    /**
     * 获取用户存储统计
     * 
     * @param userId 用户ID
     * @return 统计信息
     */
    Map<String, Object> getStorageStats(Long userId);

    /**
     * 检查文件是否重复
     * 
     * @param fileHash 文件哈希
     * @param userId 用户ID
     * @return 重复文件信息
     */
    MediaFile checkDuplicateFile(String fileHash, Long userId);

    /**
     * 增加查看次数
     * 
     * @param fileId 文件ID
     */
    void incrementViewCount(Long fileId);

    /**
     * 增加下载次数
     * 
     * @param fileId 文件ID
     */
    void incrementDownloadCount(Long fileId);

    /**
     * 根据时间范围查询文件
     * 
     * @param page 分页对象
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 分页结果
     */
    Page<MediaFile> selectMediaFilesByTimeRange(Page<MediaFile> page, Long userId, String startTime, String endTime);
}